package com.zuoshenge.util;

import cn.hutool.crypto.digest.DigestUtil;
import com.zuoshenge.bean.JwtProperties;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.security.Key;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

@Component
public class JwtTokenUtil {  
  
    private static final String SECRET_KEY = "user_token";

    @Resource
    private JwtProperties jwtProperties;


    // 使用构造函数注入或其他方式设置secretKey  
  
    public String generateToken(Authentication authentication) {

//        User userDetails = (User) authentication.getPrincipal();
  
        Map<String, Object> claims = new HashMap<>();

        byte[] keyBytes = Decoders.BASE64.decode(jwtProperties.getBase64Secret());
        Key key = Keys.hmacShaKeyFor(keyBytes);

        return Jwts.builder()
                // 设置JWT的声明，这里为空
                .setClaims(claims)
                // 设置JWT的主题，通常为用户名
                .setSubject(authentication.getName())
                // 设置JWT的发行时间
                .setIssuedAt(new Date(System.currentTimeMillis()))
                // 设置JWT过期时间，这里为10h
                .setExpiration(new Date(System.currentTimeMillis() + (1000 * 60 * 60 * 10))) // 10 hours
                // 设置加密算法对这个令牌进行签名
                .signWith(key, SignatureAlgorithm.HS256)
                .compact();
    }

    public String generateRememberMeToken(Authentication authentication) {

        Map<String, Object> claims = new HashMap<>();
        // 你可以在这里添加一些自定义的声明，比如用户ID或其他信息
        // 但对于“记住我”令牌，通常不需要太多声明

        byte[] keyBytes = Decoders.BASE64.decode(jwtProperties.getRememberMeBase64Secret()); // 使用不同的密钥或密钥对
        Key key = Keys.hmacShaKeyFor(keyBytes);

        // 设置一个更长的过期时间，比如一个月（根据需求调整），这里为3天
        long oneMonthMillis = 1000L * 60 * 60 * 24 * 3;
        Date expirationDate = new Date(System.currentTimeMillis() + oneMonthMillis);

        return Jwts.builder()
                // 设置JWT的声明（如果需要）
                .setClaims(claims)
                // 设置JWT的主题，通常为用户名或用户ID
                .setSubject(authentication.getName())
                // 设置JWT的发行时间
                .setIssuedAt(new Date(System.currentTimeMillis()))
                // 设置JWT的过期时间
                .setExpiration(expirationDate)
                // 设置一个自定义的标识，用于区分这是“记住我”令牌
                .setId(UUID.randomUUID().toString()) // 或者其他唯一标识符
                // 设置加密算法对这个令牌进行签名
                .signWith(key, SignatureAlgorithm.HS256)
                .compact(); // 生成并返回JWT
    }

    public String loginStudentKey(String token) {
        String md5Sid = DigestUtil.md5Hex(token);
        return jwtProperties.getOnlineStudentKey() + "-" + md5Sid;
    }

    public String punishmentKey(String username) {
        String md5Username = DigestUtil.md5Hex(username);
        return jwtProperties.getPunishmentKey() + "-" + md5Username;
    }

    public String getToken(HttpServletRequest request) {
        final String requestHeader = request.getHeader(jwtProperties.getHeader());
        if (requestHeader != null && requestHeader.startsWith(jwtProperties.getTokenStartWith())) {
            return requestHeader.substring(7);
        }
        return null;
    }
}